方法如下a.get_taskrs(tid,w.(http.CloseNotifier).CloseNotify()),使用的是response里面的一个关闭的通知选项
中间尝试使用defer+指针的方式然而并没有什么卵用
1
2
3
4
5func httphandler(){
i := 0
defer f(){i = 1;log.Println("Close")}
a.get_taskrs(tid,&i)
}1
2
3
4
5
6
7
8
9
10func(a *Agent)get_taskrs(tid int,f *int)(ts shell.TaskStatus){
i := 0
for{
ts := a.get_taskr(tid)
if ts.Status != 0 || *f > 0 || i>10{
break
}
i++
}
}//使用defer这种方法的前提是以为客户端断开连接之后handler返回,然后在返回之前告知get_taskrs别再get了,但是开始怎么样也不会返回即便是关闭了连接,也不会打出close于是猜测handler在等待get_taskrs返回,于是就加了一个flag i来测试,发现真的是这样!!简直是个先有鸡还是先有蛋的问题,也不对。。。主要是close连接之后handler并不会return而是无线等待于是改成了如下这种形式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17ts = a.get_taskrs(tid,w.(http.CloseNotifier).CloseNotify())
func (a *Agent)get_taskrs(tid int,cb <- chan bool)(ts shell.TaskStatus){
tag:
for{
select{
case <- time.After(1 * time.Second):
ts := a.get_taskr(tid)
log.Println("Get:",ts)
if ts.Status != 0{
break tag
}
case <- cb:
break tag
}
}
return ts
}Done
还有一种思路,就是使用go里面的闭包https://medium.com/@matryer/the-http-handler-wrapper-technique-in-golang-updated-bc7fbcffa702
转载请注明来源链接 http://just4fun.im/2018/07/07/golang httphandler return after client close connection/ 尊重知识,谢谢:)